#!/bin/bash

#########################################
#	Grupo 06 - 2012 2° Cuatrimestre	#
#		Comando buscarW5.sh     #
#########################################

CONFIG="${CONFDIR}InstalaW5.conf"
LOGGER_EXE="perl ${BINDIR}LoguearW5.pl"

ARCHPATRONES="${MAEDIR}patrones"
ARCHSISTEMAS="${MAEDIR}sistemas"
ARCHLOG="${LOGDIR}BuscarW5.log"
CICLOS=1

TMP="temp"
TMP_PATRONES="temp_patrones"
TMP_HALLA="temp_halla"
FOUND="found"


# Carga la variable CICLOS desde el archivo de configuracion
function cargarCiclos() {
	CICLOS=$(grep SECUENCIA2 $CONFIG | cut -f2 -d'=')
}


# Recibe una variable de tipo string la convierte a int
function atoi() {
	local i
	i=$(echo "$1" | tr -d $'\r')
	return $(echo $i | bc)
}


# Busca la cantidad de archivos a procesar
# Es igual a la cantidad de archivos en ACEPDIR
function getCantArch() {
	atoi $(ls -1 $ACEPDIR | wc -l)
	return $?
}


#DEPRECATED
# Actualiza los ciclos en el archivo de configuracion
function actualizaCiclos() {
	sed -i s/SECUENCIA2=[0-9][0-9]*/SECUENCIA2="$CICLOS"/ $CONFIG
}


# Graba el inicio del proceso en el archivo de log
# Recibe el numero de ciclo y la cantidad de archivos a procesar
function grabarInicio(){
	echo "Inicio BuscarW5 – Ciclo Nro.: $1 - Cantidad de Archivos: $2" >> $ARCHLOG
}


# Recibe el nombre del archivo y devuelve el SIS_ID
function getSisId() {
	echo $(echo $1 | cut -f1 -d'_')
}


# Dado un SisId, devuelve el nombre del sistema
# Actualmente esta función NO se usa, pero la dejo hecha (por las dudas, vió?)
function getNombreSistema() {
	local res=$(grep "$1" $ARCHSISTEMAS)
	echo $(echo $res | cut -f2 -d',')
}


# Recibe PATH/fileName y devuelve fileName
function getNombreArchivo() {
	cant=$(grep -o "/" <<< $1 | wc -l)
	cant=$(( $cant + 1 ))
	echo $(cut -f$cant -d'/' <<< $1)
}


function procesarArchivo() {
	IFS="@@@"
	local NAME=$(getNombreArchivo $1)
	local PATHARCHIVO=$1
	local HayHalla=0
	
	# Escribe el log con el archivo a procesar
	echo "Archivo a procesar: $NAME" >> $ARCHLOG
	 
	# Obtengo el SIS_ID a partir del nombre del archivo
	local SIS_ID=$(getSisId $NAME)
	# Obtiene el nombre del sistema (en caso que sea necesario)
	#local SISTEMA=$(getNombreSistema $SIS_ID)
	
	# Guarda todas las lineas de patrones que corresponde buscar para
	# este archivo
	grep $SIS_ID $ARCHPATRONES >> $TMP_PATRONES
	
	if [ ! -s $TMP_PATRONES ] ; then # Veo que el archivo no esté vacío
		echo "No hay patrones aplicables para este archivo" >> $ARCHLOG
		SinPatron=$(( $SinPatron + 1 ))
		HayHalla=-1		#flag
	fi
	
	# Valido que no este repetido
	if [ -e "${PROCDIR}${NAME}" ]; then
		moverW5 "${PROCDIR}${NAME}" $RECHDIR # el ARCHIVO a RECHDIR empleando la función MoverW5
		$LOGGER_EXE -e -c=303 -l="BuscarW5.sh"
		return
	fi
	
	while IFS=, read PAT_ID PATRON SIS_ID CTX DESDE HASTA
	do
		echo "$PAT_ID,$PATRON,$SIS_ID,$CTX,$DESDE,$HASTA"
		
		
		
		local ArchResGlobal="$PROCDIR""rglobales.$PAT_ID"
		local ArchResultado="$PROCDIR""resultados.$PAT_ID"
		
		atoi $DESDE
		DESDE=$?
		atoi $HASTA
		HASTA=$?
		
		if [ "$DESDE" -gt "$HASTA" ] ; then
			$LOGGER_EXE -e -c=236 -l="BuscarW5.sh" # archivo patrones invalido
			continue
		fi
		
		# Saco las comillas del patron
		local RegExp=$(echo $PATRON | sed "s/'//g")
		
		
		# Paso todos los hallazgos a un archivo temporal
		grep "$RegExp" $PATHARCHIVO >> $TMP_HALLA
		
		HALLAZGOS=0
		
		local matchTemp="match.$PAT_ID"
		echo -n > $matchTemp
		
		while read MATCH # Voy leyendo los hallazgos
		do
			MATCH="${MATCH%?}"	# saco el ultimo caracter
			
			echo "$MATCH" >> $matchTemp
			
			repe=`fgrep -c "$MATCH" $matchTemp`
			local linea=$(fgrep -n "$MATCH" $PATHARCHIVO | sed -n "$repe,$repe"p | cut -f1 -d':')
			
			HayHalla=1 # flag
			HALLAZGOS=$(( $HALLAZGOS + 1 ))
			
			if [ "$CTX" = "linea" ] ; then
				let auxDESDE=$linea+$DESDE-1
				let auxHASTA=$linea+$HASTA-1
				
				# Me quedo solo con las lineas correspondientes 
				local res=$(sed -n "$auxDESDE","$auxHASTA"p $PATHARCHIVO)
				
				echo "$CICLOS+-#-+$NAME+-#-+$linea+-#-+$res" >> $ArchResultado
			fi
			
			if [ "$CTX" = "caracter" ]; then
				local res=$(fgrep "$MATCH" $PATHARCHIVO | uniq)
				# me quedo con la parte de la linea que me interesa
				local resCut=$(cut "-c$DESDE-$HASTA" <<< "$res")

				echo "$CICLOS+-#-+$NAME+-#-+$linea+-#-+$resCut" >> $ArchResultado
			fi
		
		done < $TMP_HALLA
		rm -f $matchTemp
		# FIN PATRON
		echo "$CICLOS,$NAME,$HALLAZGOS,$PATRON,$CTX,$DESDE,\
$HASTA" >> $ArchResGlobal
		
		rm -f $TMP_HALLA
	
	done < $TMP_PATRONES
	
	rm -f $TMP_PATRONES
	
	if [ $HayHalla -eq 0 ]; then
		SinHalla=$(( $SinHalla + 1 ))
	elif [ $HayHalla -gt 0 ]; then
		ConHalla=$(( $ConHalla + 1 ))
	fi
}


buscarW5() {
	
	# Verifico que no haya otro BuscarW5 corriendo
	local res=$(ps | grep -c BuscarW5.sh)
	atoi $res
	res=$?
	if [ $res -gt 2 ]; then
		$LOGGER_EXE -e -c="920" -l="BuscarW5.sh"
		return
	fi
		
	SinPatron=0
	ConHalla=0
	SinHalla=0
	
	cargarCiclos
	let CICLOS=$CICLOS+1
	getCantArch
	grabarInicio $CICLOS $?
	ls $ACEPDIR >> "tmpArchAcepdir"
	while read FILE
	do
		procesarArchivo "${ACEPDIR}$FILE"
		mv "${ACEPDIR}$FILE" "$PROCDIR"
	done < "tmpArchAcepdir"
	
	rm -f "tmpArchAcepdir"
	
	echo "Fin del Ciclo: $CICLOS - Cantidad de Archivos con Hallazgos: $ConHalla – Cantidad de Archivos sin Hallazgos: $SinHalla – Cantidad de Archivos sin Patrón aplicable: $SinPatron" >> $ARCHLOG	

	setConfigVar.sh SECUENCIA2 $CICLOS
}

buscarW5
